/**
 * 
 */
package sistema.contexto.avaliacao.dao;

import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import sistema.contexto.avaliacao.Avaliacao;
import util.InvalidFileException;
import facade.excecoes.ValidacaoException;

/**
 * @author Thiago Emmanuel Pereira da Cunha Silva, thiago.manel@gmail.com
 * @since 10/05/2006
 */
public class AvaliacaoXMLDAO implements AvaliacaoDAO {

	private Map<String, Avaliacao> avaliacoes;
	private final String rootDirectory =   "data";	//FIXME: TIRA ISSO DAQUI
	private final String baseFile =   "avaliacoes.xml";//FIXME: TIRA ISSO DAQUI
	
	/**
	 * 
	 *
	 */
	public AvaliacaoXMLDAO() {
		avaliacoes = fromData();
	}
	
	/* (non-Javadoc)
	 * @see sistema.contexto.avaliacao.dao.AvaliacaoDAO#adicionaAvaliacao(sistema.contexto.avaliacao.Avaliacao)
	 */
	public void adicionaAvaliacao(Avaliacao avaliacao) {
		if(containsAvaliacao(avaliacao.getIdAvaliacao())) {
			throw new IllegalArgumentException(ValidacaoException.JAH_EXISTE_AVALIACAO);
		}
		avaliacoes.put(avaliacao.getIdAvaliacao(), avaliacao);	//id duplicado
		toData(avaliacoes);
	}

	/* (non-Javadoc)
	 * @see sistema.contexto.avaliacao.dao.AvaliacaoDAO#containsAvaliacao(java.lang.String)
	 */
	public boolean containsAvaliacao(String idAvaliacao) {
		return avaliacoes.containsKey(idAvaliacao);//fazer um get Antes ?
	}

	/* (non-Javadoc)
	 * @see sistema.contexto.avaliacao.dao.AvaliacaoDAO#getAvaliacoes()
	 */
	public Collection<Avaliacao> getAvaliacoes() {
		return avaliacoes.values();//fazer um get antes ?
	}
	
	/**
	 * @return
	 */
	private Map fromData() {
		try {
			//TODO FIXME refazer, eh aqui mesmo essa verificacao?
			if(!new File(rootDirectory+File.separator+baseFile).exists()) {
				new File(rootDirectory+File.separator+baseFile).createNewFile();
			}
			return (Map) new AvaliacaoXMLReader().processFile(rootDirectory+File.separator+baseFile);
		} catch (Exception e) {}
		return new HashMap<String, String>(); 
	}
	
	/**
	 * @param avaliacoes
	 */
	private void toData(Map avaliacoes){
		try {
			//TODO FIXME refazer, eh aqui mesmo essa verificacao?
			if(!new File(rootDirectory+File.separator+baseFile).exists()) {
				new File(rootDirectory+File.separator+baseFile).createNewFile();
			}
			new AvaliacaoXMLWritter().processFile(rootDirectory+File.separator+baseFile, avaliacoes);
		} catch (Exception e) {
//			//e.printStackTrace(); //decidir quem vai tratar
		}
	}

	public void zerarDados() {
		this.avaliacoes = new HashMap<String,Avaliacao>();
		this.toData(this.avaliacoes);
	}

}
